/**
 * userchache file;
 * company:junqitecch
 * author:xuzuiotao
 * request from the http body throght post method
 */



var  redis = require('redis');
var guid= require('../utils/guid');
var consts=require('../consts');

function cache(user,callback) {
	var client= redis.createClient('6300',consts.RedisServerIP);//'127.0.0.1');
	client.on('ready',function(err){
        client.hget('onlines',user.userID,function(err,content){
        	
        	var obj = null;

        	if(!err && content !==null){
        		try {
				    obj=JSON.parse(content);	
				} catch (e) {
					
				}
        	}
        	var oldtoken= null;
        	if(obj===null){
        		obj= {};
        	}else{
        		oldtoken=obj.token;
        	}
    	    var  token = guid.create();
    	    obj.token=token;
    	    obj.entity=user;
    		client.multi();
    		console.log('old::'+oldtoken);
    		if(oldtoken!==null)client.hdel('tokens',oldtoken);
    		
    		client.hset('tokens',token,user.userID);
    		console.log('token::'+token);

    		client.hset('onlines',user.userID,JSON.stringify(obj));
    		client.exec(function (err, replies) {
    			client.quit();
    			if(callback!==null){
    				 callback(token,user);
    			}
    	});
        
        });
	    
	});
	
}


/*
 * todo，需要重新考虑token在操作过程中过期的问题
 */
function refresh(user,callback) {
	var client= redis.createClient('6300',consts.RedisServerIP);//'127.0.0.1');
	client.on('ready',function(err){
        client.hget('onlines',user.userID,function(err,content){
        	
        	var obj = null;

        	if(!err &&content !==null){
        		try {
				    obj=JSON.parse(content);	
				} catch (e) {
					
				}
        	}
        	
        	if(obj===null ||obj.token===null || typeof(obj.token)==='undefined'){
    			client.quit();
        		if(callback!==null){
        			callback(null,null);
        		}
        		return;
        	}

    	    obj.entity=user;
    		client.multi();
    		
    		client.hset('onlines',user.userID,JSON.stringify(obj));
    		client.exec(function (err, replies) {
    			client.quit();
    			if(callback!==null){
    				 callback(obj.token,user);
    			}
    	
    		});
        
        });
	    
	});
	
}



function getByID(ID,callback){
	var client= redis.createClient('6300',consts.RedisServerIP);//'127.0.0.1');
	client.on('ready',function(err){
	    console.log('ready');
	    client.hget('onlines',ID,function(err,content){
	    	if(err || content ===null){
	    		if(callback){
	    			callback(null,null);
	    		}
    			client.quit();

	    	}else{
	    		var obj = null;
	    		try {
		    		obj = JSON.parse(content);

				} catch (e) {
				}
	    		if(obj===null|| obj.entity===null || typeof(obj.entity) ==='undefined' || 
	    			 obj.entity === null || typeof(obj.entity.userID)=== 'undefined' || obj.entity.userID===null){
	    			client.quit();

	    			if(callback){
		    			callback(null,null);
		    		}
	    			return;

	    		}else{
	    			client.hget('tokens',obj.token,function(err,content){
	    				if(err){
	    	    			client.quit();

	    					if(callback){
	    		    			callback(null,null);
	    		    		}
	    				}else{
	    	    			client.quit();

	    					if(callback){
	    						callback(obj.token,obj.entity);
	    					}
	    				}
	    			});
	    		}
	    	}
	    	
	    });
	    
	});
}

function getByToken(token,callback){
	var client= redis.createClient('6300',consts.RedisServerIP);//'127.0.0.1');
	client.on('ready',function(err){
	    console.log('ready');
	    client.hget('tokens',token,function(err,content){
	    	if(err || content===null ){
	    		if(callback){
	    			callback(null,null);
	    		}
    			client.quit();

	    	}else{
	    		client.hget('onlines',content,function(err,content){
	    			if(err){
		    			client.quit();

	    				if(callback){
	    		    		callback(null,null);
	    		    	}
	    			}else{
	    					
	    				var obj = null;
	    		    	try {
	    		    		
	    			   		obj = JSON.parse(content);

	    				} catch (e) {
	    					
	    				}
	    				if(obj===null|| obj.entity===null || typeof(obj.entity) ==='undefined' || 
	    		    		obj.entity === null || typeof(obj.entity.userID)=== 'undefined' || obj.entity.userID===null){
	    	    			client.quit();

	    					if(callback){
	    			    			callback(null,null);
	    			    	}
	    					return;
	    		    		
	    				}
	    					
		    			client.quit();

	    				if(callback){
	    					callback(obj.token,obj.entity);
	    				}
	    				}
	    			});
	    		
	    	}
	    	
	    });
	    
	});
}


function delByToken(token,callback){
	var client= redis.createClient('6300',consts.RedisServerIP);//'127.0.0.1');
	client.on('ready',function(err){
	    console.log('ready');
	    client.hget('tokens',token,function(err,userID){
	    	if(err || typeof(userID)==='undefined' ||userID===null){
	    		if(callback){
	    			err= new Error();
	    			
	    			callback(err);
	    		}
    			client.quit();

	    	}else{
	    		client.hget('onlines',userID,function(err,content){
	    			if(err){
	    				
	    				client.hdel('tokens',token);
		    			client.quit();

	    				if(callback){
	    	    			callback();
	   		    		}
	   				}else{
	   					var obj = null;
	   		    		try {
    			    		obj = JSON.parse(content);

	   		    		} catch (e) {
	    				
	   		    		}
	    					
	    		    	if(obj===null||typeof(obj.token) ==='undefined' || obj.token===null){
	    	    			client.quit();

	    		    		if(callback){
	    			    		callback();
	    			    	}
			    			client.quit();

	    		    		return;
	    		    	
	    		    	}
	    		    	console.log(obj.token);
	    		    	console.log(token);
	    		    		
	    		    	console.log(content+"::aaaa");

	    				if(token == obj.token){
	    					client.hdel('onlines',userID);
	    				}
	    				client.hdel('tokens',token);
		    			client.quit();

	    				if(callback){
	    					callback();
	    				}
	    				
	   				}
	    			
	    		});
	    		
	    	}
	    	
	    });
	    
	});
}

//hmget

module.exports = {
	  cache:cache,
	  getByID:getByID,
	  getByToken:getByToken,
	  delByToken:delByToken,
	  refresh:refresh
  };

